package com.zhdl.common.util;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSONObject;
import com.zhdl.common.constant.HttpCodeEnum;
import com.zhdl.common.protal.PageRes;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.domain.PageRequest;

import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import static com.zhdl.common.constant.Dic.REQUEST_STATUS_ERROR;
import static com.zhdl.common.constant.Dic.REQUEST_STATUS_SUCCESS;

/**
 * 统一相应输出
 *
 * @author
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WebResult<T> implements Serializable {

    @Serial
    private static final long serialVersionUID = 2907211119535752349L;

    /**
     * 执行返回码
     *
     * @mock 0
     * @since v1.0
     */
    private int code;

    /**
     * 返回说明
     *
     * @mock 成功
     * @since v1.0
     */
    private String msg;

    /**
     * 返回时间信息 yyyy-MM-dd HH:mm:ss
     *
     * @mock
     */
    private String timestamp;

    /**
     * 返回数据
     *
     * @param data|对象
     * @mock {"id":"1234","name":"张三","age":"11"}
     * @since v1.0
     */
    private T data;

    public static WebResult result(boolean flag) {
        if (flag) {
            return okResult();
        }
        return failResult();
    }

    /**
     * 成功操作 操作码默认为200   无参
     *
     * @return
     */
    public static WebResult okResult() {
        return okResult("");
    }

    /**
     * 成功操作 设置数据
     **/
    public static <T> WebResult<T> okResult(T data) {
        return okResult(HttpCodeEnum.SUCCESS.getCode(), data);
    }

    public static <T> WebResult<PageRes<T>> okPageResult(PageRequest pageRequest, Integer count, List<T> list) {

        PageRes<T> pageRes = new PageRes<>(pageRequest, count, list);

        return okResult(HttpCodeEnum.SUCCESS.getCode(), pageRes);
    }


    /**
     * 成功操作 设置返回码及数据
     **/
    public static <T> WebResult<T> okResult(int code, T data) {
        return okResult(code, REQUEST_STATUS_SUCCESS, data);
    }


    /**
     * 成功操作 设置返回码及数据及message信息
     **/
    public static <T> WebResult<T> okResult(int code, String msg, T data) {
        return WebResult.<T>builder()
                .data(data)
                .code(code)
                .msg(msg)
                .timestamp(DateUtil.now())
                .build();
    }

    /**
     * 失败返回 无参
     *
     * @return
     */
    public static WebResult failResult() {
        return failResult("");
    }

    /**
     * 失败返回 设置失败码
     **/
    public static WebResult failResult(int code) {
        return failResult(code, REQUEST_STATUS_ERROR);
    }

    /**
     * 失败返回 设置msg
     **/
    public static WebResult failResult(String msg) {
        return failResult(HttpCodeEnum.INTERNAL_SERVER_ERROR.getCode(), msg);
    }

    /**
     * 失败返回 设置返回码及msg
     **/
    public static WebResult failResult(int code, String msg) {
        return failResult(code, msg, "false");
    }


    /**
     * 失败返回 设置返回码及数据及message信息
     **/
    public static <T> WebResult<T> failResult(int code, String msg, T data) {
        return WebResult.<T>builder()
                .data(data)
                .code(code)
                .msg(msg)
                .timestamp(DateUtil.now())
                .build();
    }

    public static WebResult buildFail(Map<String, Object> map) {
        return failResult((int) map.get("code"), (String) map.get("msg"), map.get("data"));
    }

    /**
     * 使用fastjson 对象转换map
     *
     * @param obj
     * @return
     */
    public static Map<String, ?> objectToMap(Object obj) {
        if (obj == null) {
            return null;
        }
        String jsonStr = JSONObject.toJSONString(obj);
        return JSONObject.parseObject(jsonStr);
    }

    /**
     * 将自身转换为map
     *
     * @return
     */
    public Map<String, String> toMap() {
        return (Map<String, String>) objectToMap(this);
    }
}
